package com.project.srtp.secure.controller;

import com.project.srtp.secure.common.result.Result;
import com.project.srtp.secure.common.result.Results;
import com.project.srtp.secure.dto.req.SecureFileReqDTO;
import com.project.srtp.secure.dto.resp.SecureFileRespDTO;
import com.project.srtp.secure.service.SecureService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;

/**
 * @author 曹行阳
 * @version 0.1
 * @date 2025/6/10 16:56
 * SecureController：提供文件上传（加密）与下载（解密）接口
 */
@RestController
@RequiredArgsConstructor
public class FileController {

    private final SecureService secureService;

    /**
     * 文件上传并加密存储
     *
     * @param file 上传的文件内容（Multipart格式）
     * @param ownerId 文件所有者ID
     * @return 包含加密文件元数据的响应结果
     * @throws Exception 加密或存储失败时抛出异常
     *
     */
    @PostMapping("/api/file/upload")
    public Result<SecureFileRespDTO> uploadEncrypted(
            @RequestParam("file") @Valid MultipartFile file,
            @RequestParam("ownerId") @Valid String ownerId) throws Exception {
        // 构建加密文件请求对象
        SecureFileReqDTO request = new SecureFileReqDTO();
        request.setFile(file);
        request.setOwnerId(ownerId);

        // 执行加密上传操作
        SecureFileRespDTO resp = secureService.uploadAndEncrypt(request);
        return Results.success(resp);
    }

    /**
     * 获取用户文件列表
     *
     * @return 用户可访问的加密文件列表（不包含文件内容）
     *
     */
    @GetMapping("/api/file/list")
    public Result<List<SecureFileRespDTO>> listFile(){
        return Results.success(secureService.listFile());
    }

    /**
     * 下载并解密文件
     *
     * @param fileId 要下载的文件ID（路径变量）
     * @param ownerId 文件所有者ID（验证下载权限）
     * @param response HTTP响应对象（用于直接输出文件流）
     *
     */
    @GetMapping("/api/file/download/{fileId}")
    public void downloadDecrypted(
            @PathVariable Long fileId,
            @RequestParam("ownerId") String ownerId,
            HttpServletResponse response) {
        try {
            // 执行解密下载操作
            secureService.downloadAndDecrypt(fileId, ownerId, response);
        } catch (Exception e) {
            // 异常处理（实际项目应记录日志并返回错误响应）
            e.printStackTrace();
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * 删除加密文件
     *
     * @param fileId 要删除的文件ID
     * @return 操作结果
     *
     */
    @DeleteMapping("/api/file/delete/{fileId}")
    public Result<Void> deleteFile(@PathVariable Long fileId){
        secureService.deleteFile(fileId);
        return Results.success();
    }
}
